Spring Boot 中流操作使用

Java 8里面的流对象真好用,函数式编程让编码不一样,并且还能并发执行。这里给出一个业务中实际遇到的数据查询映射成一个奇特的Map映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
table1: [
{
name1: "",
name2: ""
},
{
name1: "",
name2: ""
}
],
table2: [
{
name3: "1",
name4: "2"
},
{
name3: "3",
name4: "4"
}
]
}

如果使用普通的操作分别查询出table内的数据行得到List<table1Entity> lists 然后Map.put("table1",lists)就完成了,但是这对于表多的话重复代码就变多了,不符合代码重用的思想。这里给出一个解决方法:

使用 Java8 的stream API可以较为高效的并发操作,不过理解起来有点难度,(调试也需要一点技巧?)

首先新建一个key的列表List<String> names, 由其生成一个stream放入查询接口进行查询,得到另一个流,使用一个map进行映射出Javabean,利用filter删除为空的结果,最后Collectors.toList() 收集流。此时得到的是table1、table2的键值对数组([{"name1":"","name2":""}])。下面给他们按类别扔进对应的Key(由于没有统一基类故使用反射API调用其类型函数,返回类别),Collectors.toMap(s->{s.get(0).getClass().getMethod("getItemType").invoke(s)},s->s)。附一张图参考,可能还需要进一步优化,不过肯定比线性查询出来后一行一行来的快(见灰色注释掉的代码)
流操作消除重复代码

Author: whllhw
Link: https://whllhw.ml/posts/2018/11/21/Spring Boot 中流操作使用/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.